// 知识点1：大多数的应用应该使用标准库容器，而不是使用动态分配的数组

// 知识点2：用new分配的动态数组会返回一个元素类型的指针，而并未得到数组类型的对象

// 知识点3：动态数组并不是数组类型，不能调用begin()和end()函数，详见106页

// 知识点4：释放动态数组时，需要在指针名前加 [ ] ，数组中的元素按照逆序销毁

// 知识点5：字符串字面常量不同于普通的局部变量，具有static duration
// lifetime,这整个程序的生命周期中都将存在
#include <algorithm>
#include <cctype> //ctype无法打开，包含tolower()函数和ispunct函数
#include <fstream>
#include <iostream>
#include <list>
#include <map>
#include <set>
#include <string>
#include <utility> //保存pair的头文件
#include <vector>

using namespace std;

int main(int argc, char **argv) {
  char *s1 = "abc";
  char *s2 = "efg"; //字符串字面常量,字符串末尾有空格
  string si = "a";
  string sl = "b";                                 //标准库string对象
  char *p = new char[strlen(s1) + strlen(s2) + 1]; //必须指明要分配对象的个数
  strcpy(p, s1);                                   //复制
  strcat(p, s2);                                   //接上
  cout << p << endl;
  strcpy(p, (si + sl).c_str()); //必须转换为c类型字符串(c中无string类型)
  cout << p << endl;
  delete[] p;
  return 0;
}